package com.ma.middleware.dynamic.thread.pool.trigger;

import com.alibaba.fastjson.JSON;
import com.ma.middleware.dynamic.thread.pool.sdk.domain.model.entity.ThreadPoolConfigEntity;
import com.ma.middleware.dynamic.thread.pool.types.Response;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RList;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 纪律和心态控制重于一切，这一切的前提是必须要有一套完善的经过市场的交易系统，否则，就有留有空谈的危险。
 * 阅读西方技术分析经典，商品、利率、期值、股票等。学习是线性的，而创造是非线性的，融会贯通，提炼，萃取出自己的交易系统。
 * 如果我没有简单的解释她，我就没有真正的理解它。真理总是以最简单的形式存在，只是我们把他想复杂了。把握市场的脉搏，作出明智的交易决策。减少决策，避免内耗。
 * 人的意志力是有限资源，没做一个决定都会消耗意志力。
 * 简单框架。抵御市场风险。
 * 系统越简单，运行越稳定，
 * 重读练习，铸就交易本质。
 * 就是把简单的交易方法反复练，练到像条件反射一样自然。经过长时间的重复练习，当特定的k线形态出现是，他们能迅速作出反应，无需过多思考。
 * 时机筛选越来越严苛，胜算越来越高时，耐性越来越强。
 * 懂得交易本质不是追求短期的暴利，而是长期的生存。
 * 交易的本质，人性的镜像与信仰的力量
 * 性格急躁的人越容易频繁交易，性格优柔寡断的人，在面对止损或止盈时往往犹豫不决，错失良机，因此，交易的修行，本质是一场对人性的修炼。
 * 在反复折磨中坚守热爱。
 * 资金管理：交易生存之本。
 * 独立思维和逆势操作：超越从众的勇气。
 * 低风险思维：像猎手一样等待，时间，学会在交易中休息
 * 知行合一
 *
 */
@Slf4j
@RestController
@RequestMapping("/api/v1/dynamic/thread/pool/")
@CrossOrigin("*")
public class DynamicThreadPoolController {
    @Resource
    public RedissonClient redissonClient;

    /**
     * 查询线程池数据
     * @return
     */
    @RequestMapping(value = "query_thread_pool_list",method = RequestMethod.GET)
    public Response<List<ThreadPoolConfigEntity>> queryThreadPoolList(){
        try{
            RList<ThreadPoolConfigEntity> cacheList = redissonClient.getList("THREAD_POOL_CONFIG_LIST_KEY");
            return Response.<List<ThreadPoolConfigEntity>>builder()
                    .code(Response.Code.SUCCESS.getCode())
                    .info(Response.Code.SUCCESS.getInfo())
                    .data(cacheList.readAll())
                    .build();
        }catch (Exception e){
            log.error("查询线程数据异常",e);
            return Response.<List<ThreadPoolConfigEntity>>builder()
                    .code(Response.Code.UN_ERROR.getCode())
                    .info(Response.Code.UN_ERROR.getInfo())
                    .build();
        }
    }

    /**
     * 查询线程池配置
     * @param appName
     * @param threadPoolName
     * @return
     */
    @RequestMapping(value = "query_thread_pool_config",method = RequestMethod.GET)
    public Response<ThreadPoolConfigEntity> queryThreadPoolConfig(@RequestParam String appName,@RequestParam String threadPoolName){
        try{
            String cacheKey = "THREAD_POOL_CONFIG_PARAMETER_LIST_KEY"+"_"+appName+"_"+threadPoolName;
            ThreadPoolConfigEntity threadPoolConfigEntity = redissonClient.<ThreadPoolConfigEntity>getBucket(cacheKey).get();
            return Response.<ThreadPoolConfigEntity>builder()
                    .code(Response.Code.SUCCESS.getCode())
                    .info(Response.Code.SUCCESS.getInfo())
                    .data(threadPoolConfigEntity)
                    .build();
        }catch (Exception e){
            log.error("查询线程池配置异常",e);
            return Response.<ThreadPoolConfigEntity>builder()
                    .code(Response.Code.UN_ERROR.getCode())
                    .info(Response.Code.UN_ERROR.getInfo())
                    .build();
        }
    }
    /**
     * 修改线程池配置
     */
    @RequestMapping(value = "update_thread_pool_config",method = RequestMethod.POST)
    public Response<Boolean> updateThreadPoolConfig(@RequestBody ThreadPoolConfigEntity request){
        try {
            log.info("修改线程池配置开始{}{}{}",request.getAppName(),request.getThreadPoolName(), JSON.toJSONString(request));
            RTopic topic = redissonClient.getTopic("DYNAMIC_THREAD_POOL_REDIS_TOPIC" + "_" + request.getAppName());
            topic.publish(request);
            log.info("修改线程池配置完成{}{}",request.getAppName(),request.getThreadPoolName());
            return Response.<Boolean>builder()
                    .code(Response.Code.SUCCESS.getCode())
                    .info(Response.Code.SUCCESS.getInfo())
                    .data(true)
                    .build();
        }catch (Exception e){
            log.error("修改线程池配置异常{}",JSON.toJSONString(request),e);
            return Response.<Boolean>builder()
                    .code(Response.Code.UN_ERROR.getCode())
                    .info(Response.Code.UN_ERROR.getInfo())
                    .data(false)
                    .build();
        }
    }
}
